#include "SRTree.h"

SphereBoundingBox::SphereBoundingBox(){

}

SphereBoundingBox::~SphereBoundingBox(){

}

EntradaInternaRSTree::EntradaInternaRSTree(No*filho): EntradaInterna(filho){
    this->sbb = new SphereBoundingBox();
    this->bb = new BoundingBox(DESCRIPTOR_SIZE);
}

EntradaInternaRSTree::~EntradaInternaRSTree(){
    if (this->sbb != NULL) delete(this->sbb);
    if (this->bb != NULL) delete(this->bb);
}

SRTree::SRTree(bool eRaiz, bool eFolha){
    this->eRaiz = eRaiz;
    this->eFolha = eFolha;
    this->indiceEntrada = 0;
    for (int i = 0; i< MAX_ENTRADAS; i++)
        entradas[i] = NULL;
}

SRTree::~SRTree(){
    for (int i = 0; i< MAX_ENTRADAS; i++)
        if (entradas[i] != NULL) delete (entradas[i]);
}

int SRTree::menorIncSobreposicao(
            Ponto *ponto ///@in ponto que será inserido
                            ){///@out indice da entrada

    int i, indice;
	float   sp1, sp2, ///Sobreposição sem e com o ponto
            inc, menorInc = INFINITY; ///incremento de sobreposição e menor incremento
	EntradaInternaRSTree *aux;

    ///Para cada entrada calcular a sobreposição de sua bb com as outras entradas, sem e com o ponto
	for(i = 0; i < MAX_ENTRADAS; i++){
//        BoundingBox *comPonto = new BoundingBox(); ///BB auxiliar
//		aux = static_cast<EntradaInternaRSTree*>(this->entradas[i]);
//		sp1 = this->sobreposicao(aux->bb, i); ///sobreposição sem o ponto
//
//		aux->bb->copia(comPonto);
//		comPonto->insere(ponto);
//		sp2 = this->sobreposicao(comPonto, i); ///sobreposição com o ponto
//		delete comPonto;
//
//		inc = sp2 - sp1;
//		if(inc < menorInc){
//			menorInc = inc;
//			indice = i;
//		}
	}

//	aux = static_cast<EntradaInterna*>(this->entradas[indice]);
	//*k = indice;
	//return aux->filho;

}

SRTree* SRTree::escolherSubarvore(Ponto *ponto){
    if (this->eRaiz && this->eFolha)
        return this;
    else{
        //if (this->eFolha)
    }
}

SRTree* SRTree::insere(SRTree* no, Ponto *p){
    if (no->indiceEntrada < MAX_ENTRADAS){
        no->entradas[no->indiceEntrada++] = new EntradaFolha(p);
        no->bb->insere(p);

        return no;
    }
    else{
        printf("divide no\n");
        no->bb->ajustaInterna((EntradaInterna**) no->entradas, DESCRIPTOR_SIZE);
        return NULL;
    }
}

void SRTree::insere(Ponto *p, int tipo){
   printf("inserindo\n");
   insere(escolherSubarvore(p),p);
}
